package org.review.algorithm.sort;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;

/**
 * 冒泡排序思路
 * 1、主要是怎么比出最小数、第二次比出第二小的数、第三次得出第三小的数 也就是下沉或叫上浮
 * 2、比出最小数后。再次比较如何掠过
 */
public class BubbleSort {
    public static void main(String[] args) {
    /*    int[] arr = new int[]{3, 5, 2, 23, 1, 53, 21};
        Arrays.stream(arr).forEach(e -> System.out.print(e + " "));
        impl1(arr);
        System.out.println("排序后");
        Arrays.stream(arr).forEach(e -> System.out.print(e + " "));
        impl2(arr);
        System.out.println("排序后");
        Arrays.stream(arr).forEach(e -> System.out.print(e + " "));*/

        int size = 900000;
        int[] arr = new int[size];
        for (int i = 0; i < size; i++) {
            arr[i] = (int) (Math.random() * size); // 生成一个[0, 8000000) 数
        }

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
        String date1Str = simpleDateFormat.format(new Date());
        System.out.println("排序前的时间是=" + date1Str);
        impl1(arr);
        //quickSort(arr, 0, arr.length - 1);
        String date2Str = simpleDateFormat.format(new Date());
        System.out.println("排序后的时间是=" + date2Str);
    }

    private static void impl1(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
    }

    private static void impl2(int[] arr) {//TODO 2024/8/26:这种方式是先计算比较次数  第二个for才是关键
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}
